package com.lekang.quartz.task;

import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.lekang.common.utils.DateUtils;
import com.lekang.le.domain.LeaveRequest;
import com.lekang.le.mapper.LeaveRequestMapper;

/**
 * 请假状态更新定时器
 *
 * @author system
 */
@Component("leaveRequestTask")
public class LeaveRequestStatusUpdateTask {
    private static final Logger log = LoggerFactory.getLogger(LeaveRequestStatusUpdateTask.class);

    @Autowired
    private LeaveRequestMapper leaveRequestMapper;

    /**
     * 定时检查请假状态
     * 每天凌晨1点执行一次
     * 根据当前时间与预计返回时间的关系，以及是否已填写实际返回时间，更新请假状态：
     * 请假中：当前时间 <= 预计返回时间 且 未填写实际返回时间
     * 超时未归：当前时间 > 预计返回时间 且 未填写实际返回时间
     * 已返回：已填写实际返回时间
     */
    public void updateLeaveRequestStatus() {
        log.info("开始执行请假状态更新定时任务，执行时间：{}", DateUtils.getNowDate());

        // 查询所有请假记录
        LeaveRequest queryCondition = new LeaveRequest();
        List<LeaveRequest> leaveRequests = leaveRequestMapper.selectLeaveRequestList(queryCondition);

        if (leaveRequests != null && !leaveRequests.isEmpty()) {
            int updatedCount = 0;
            Date now = new Date();

            for (LeaveRequest leaveRequest : leaveRequests) {
                // 如果已填写实际返回时间，则状态为已返回
                if (leaveRequest.getActualEndTime() != null) {
                    if (!"已返回".equals(leaveRequest.getLeaveStatus())) {
                        leaveRequest.setLeaveStatus("已返回");
                        leaveRequestMapper.updateLeaveRequest(leaveRequest);
                        updatedCount++;
                        log.info("更新请假ID：{} 状态为已返回，实际返回时间：{}",
                                leaveRequest.getId(), leaveRequest.getActualEndTime());
                    }
                } 
                // 未填写实际返回时间，根据当前时间与预计返回时间的关系判断状态
                else {
                    String newStatus = null;

                    // 当前时间 <= 预计返回时间，状态为请假中
                    if (now.before(leaveRequest.getExpectedEndTime()) || now.equals(leaveRequest.getExpectedEndTime())) {
                        newStatus = "请假中";
                    } 
                    // 当前时间 > 预计返回时间，状态为超时未归
                    else if (now.after(leaveRequest.getExpectedEndTime())) {
                        newStatus = "超时未归";
                    }

                    // 如果状态有变化，则更新
                    if (newStatus != null && !newStatus.equals(leaveRequest.getLeaveStatus())) {
                        leaveRequest.setLeaveStatus(newStatus);
                        leaveRequestMapper.updateLeaveRequest(leaveRequest);
                        updatedCount++;
                        log.info("更新请假ID：{} 状态从 {} 变更为 {}，预计返回时间：{}",
                                leaveRequest.getId(), leaveRequest.getLeaveStatus(), newStatus, 
                                leaveRequest.getExpectedEndTime());
                    }
                }
            }

            log.info("请假状态更新定时任务执行完成，共更新{}条记录", updatedCount);
        } else {
            log.info("请假状态更新定时任务执行完成，没有需要更新的记录");
        }
    }
}
